<?php

/**
 * Отвечает за выборку оценок с одинаковым заголовком
 */
class grades {
	
	/**
	 * Заголовок оценки
	 * @var string
	 */
	protected $itemname = NULL;
	
	/**
	 * Классы, требующиеся для отчета
	 * @var classes $classes
	 */
	private $classes = NULL;
	
	/**
	 * Коды, требуемых предметов
	 * @var string
	 */
	protected $course_code = NULL;
	
	function __construct($code, $itemname, $course_code = NULL) {
		$this->set_classes($code);
		$this->set_itemname($itemname);
		$this->set_course_code($course_code);
	}
	
	function __destruct() {
		
	}
	
	function set_classes($code) {
		global $CFG;
		include_once($CFG->app_dir . '/class/class.classes.php');
		$this->classes = new classes($code);
	}
		
	function set_itemname($itemname) {
		$this->itemname = $itemname;
	}
	
	function set_course_code($course_code) {
		$this->course_code = $course_code;
	}
	
	/**
	 * Взять названия нужных курсов
	 * @param object $school_class Школьный класс
	 * @return object courses
	 */
	protected function get_courses($school_class) {
		global $CFG;
		include_once($CFG->app_dir . '/grade_item/class.grade_items.php');
		include_once($CFG->app_dir . '/journal/class.journal.php');
		$item = new grade_items($this->itemname);
		return new journal(
			$school_class,
			$item->get_code(),
			$this->course_code
		);
	}
	
	/**
	 * Берёт учеников в классе
	 * @param string $class Класс
	 * @return object school_class
	 */
	private function get_school_class($class) {
		global $CFG;
		include_once($CFG->app_dir . '/class/class.school_class.php');
		return new school_class($class, true);
	}
	
	/**
	 * Взятие оценки ученика по курсу
	 * @param int $userid Идентификатор ученика
	 * @param string $course Название курса
	 * @return object grade
	 */
	function get_user_grade_for_course($userid, $course) {
		global $DB, $CFG;
		include_once($CFG->app_dir . '/grade_item/class.grade_items.php');
		include_once(__DIR__ . '/class.grade.php');
		
		$item = new grade_items($this->itemname);
		
		$sql = file_get_contents(__DIR__ . '/sql/get_user_grade_for_course.sql');
		if (($stmt = $DB->prepare($sql)) !== false) {
			$stmt->bind_param('dss', $userid, $item->get_itemname(), $course);
			$stmt->execute();
			$data = $stmt->get_result()->fetch_array(MYSQLI_ASSOC);
		} else {
			throw new Exception($DB->error);
		}
		return new grade($data["grade"]);
	}
	
	/**
	 * Берет оценки ученика по всем курсам
	 * @param int $userid Идентификатор ученика
	 * @param int $courses Курсы
	 * @return array()
	 */
	protected function get_user_grades($userid, $courses) {
		$user_grades = array();
		$i = 0;
		foreach ($courses->get_courses() as $course) {
			$user_grades[$i++] = $this->get_user_grade_for_course($userid, $course);
		}
		return $user_grades;
	}
	
	/**
	 * Взять информацию об оценках учеников в классе
	 * @param string $class Название класса
	 * @return array(array)
	 */
	protected function get_grades_in_class($class) {
		$school_class = $this->get_school_class($class);
		$courses = $this->get_courses($school_class);
		
		$data = array(
			'courses' => $courses->get_initials()
		);
		
		$pupils_iterator = $school_class->get_iterator();
		while ($pupils_iterator->valid()) {
			$pupil = $pupils_iterator->current();
			$data['pupils'][$pupils_iterator->key()]['pupil'] = $pupil;
			$data['pupils'][$pupils_iterator->key()]['grades'] = $this->get_user_grades($pupil->get_id(), $courses);
			$pupils_iterator->next();
		}
		return $data;
	}
	
	/**
	 * Берёт оценки по заданным классам
	 */
	public function get_grades() {
		$data = array();
		foreach($this->classes->get_classes() as $class) {
			$data[$class] = $this->get_grades_in_class($class);
		}
		return $data;
	}
}

?>
